/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Dato.DAO;



import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import transervfx.Dato.Entidad.Cliente;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.Lugar;
import transervfx.Dato.Entidad.LugarPersonalFrecuente;
import transervfx.Dato.Entidad.LugarTramiteFrecuente;
import transervfx.Dato.Entidad.Provincia;

/**
 *
 * @author oscar
 */
public class LugarFrecuenteDAO implements Dao<Lugar,Long> {
 
     private static LugarFrecuenteDAO INSTANCE = null;
    
    
     /**
     *  Crea el Gestor Auxiliar
     */
    protected LugarFrecuenteDAO() {
    }

    /**
     * creador sincronizado para protegerse de posibles problemas  multi-hilo
     * otra prueba para evitar instanciación múltiple
     */
    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new LugarFrecuenteDAO();
        }
    }

    /**
     * Obtiene la instancia.
     * @return devuelve la instancia del "GestorAuxiliar".
     */
    public static LugarFrecuenteDAO getInstance() {
        if (INSTANCE == null) {
            createInstance();
        }
        return INSTANCE;
    }
    

    @Override
    public void persist(Lugar entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            EntityTransaction t = em.getTransaction();
            try {
                Localidad l=entity.getLocalidad();
                t.begin();
                if(l.getId()==null){

                   em.persist(l);
                }
              
               
                em.persist(entity);
               
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    @Override
     //Sin transaccion
    public void remove(Lugar entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            em.remove(entity);

        } finally {
            em.close();
        }
    }
   

    @Override
    public Lugar findById(Long id) {
       EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.find(Lugar.class, id);

        } finally {
            em.close();
        }
    }
    
    
    
    @Override
    public void update(Lugar entity) {
          EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

          em.getTransaction().begin();
        
            em.merge(entity);
         
            em.getTransaction().commit();

        } finally {
            em.close();
        }
    }
    

   
    @Override
    public List<Lugar> findAll() {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.createNamedQuery("Lugar.findAll").getResultList();

        } finally {
            em.close();
        }
    }
    
  
    public List<LugarPersonalFrecuente> findAllLugarPersonalFrecuente(Cliente cliente) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query q=em.createNamedQuery("LugarPersonalFrecuente.findAllByCliente");
        q.setParameter("idCliente", cliente.getId());
       
       
            return q.getResultList(); 

        } finally {
            em.close();
        }
    }
    
     public List<LugarTramiteFrecuente> findAllLugarTramiteFrecuente(int ini,int nroDeElementos) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query q=em.createNamedQuery("LugarTramiteFrecuente.findAll");
        q.setFirstResult(ini);
        q.setMaxResults(nroDeElementos);
            return q.getResultList(); 

        } finally {
            em.close();
        }
    }
    
  
    
    public List<LugarTramiteFrecuente> buscarPorFiltroRangoLugarTramiteFrecuente(String calle, Integer numero, String departamento, Integer piso, String localidad, String provA, String paisA,int ini, int fin) {
        String consulta = "SELECT l FROM LugarTramiteFrecuente l";
        boolean hayotroParametro = false;

        if (!calle.equals("") || numero !=null || !departamento.equals("") || !localidad.equals("") || !provA.equals("") || !paisA.equals("") || piso != null) {
            consulta = "SELECT l FROM LugarTramiteFrecuente l JOIN l.localidad lo Join lo.provincia pr Join pr.pais pa WHERE";
            if (!calle.equals("")) {
                consulta = consulta + " l.calle LIKE " + "'" + calle + "%'";
                hayotroParametro = true;
            }
            if (!departamento.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                
                consulta = consulta + " l.departamento LIKE " + "'" + departamento + "%'";
                hayotroParametro = true;
            }
            if (!localidad.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " lo.nombre LIKE " + "'" + localidad + "%'";

            }
            if (!provA.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " pr.nombre LIKE " + "'" + provA + "'";

            }
             
              if (!paisA.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " pa.nombre LIKE " + "'" + paisA + "'";

            }
              if (numero != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

               consulta = consulta + " l.numero =" + numero  ;

            }
            if (piso != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                  consulta = consulta + " l.piso =" + piso  ;

            }

        }
       System.out.println(consulta);
        
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query query = em.createQuery(consulta);
        query.setFirstResult(ini);
        query.setMaxResults(fin);
        
        return (List<LugarTramiteFrecuente>) query.getResultList();
        
        } finally {
            em.close();
        }
    }
    

     

    public Long cantidadDeLugaresPersonales() {
       EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return (Long) em.createNamedQuery("LugarPersonalFrecuente.count").getSingleResult();

        } finally {
            em.close();
        }
    }
    
    public Long cantidadDeLugaresTramite() {
       EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return (Long) em.createNamedQuery("LugarTramiteFrecuente.count").getSingleResult();

        } finally {
            em.close();
        }
    }

    public Long cantidadDeLugaresTramitesFiltrados(String calle, Integer numero, String departamento, Integer piso, String localidad, String provA, String paisA) {
         String consulta = "SELECT COUNT(l) FROM LugarTramiteFrecuente l";
        boolean hayotroParametro = false;

        if (!calle.equals("") || numero !=null || !departamento.equals("") || !localidad.equals("") || !provA.equals("") || !paisA.equals("") || piso != null) {
            consulta = "SELECT COUNT(l) FROM LugarTramiteFrecuente l JOIN l.localidad lo Join lo.provincia pr Join pr.pais pa WHERE";
            if (!calle.equals("")) {
                consulta = consulta + " l.calle LIKE " + "'" + calle + "%'";
                hayotroParametro = true;
            }
            if (!departamento.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                
                consulta = consulta + " l.departamento LIKE " + "'" + departamento + "%'";
                hayotroParametro = true;
            }
            if (!localidad.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " lo.nombre LIKE " + "'" + localidad + "%'";

            }
            if (!provA.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " pr.nombre LIKE " + "'" + provA + "'";

            }
             
              if (!paisA.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " pa.nombre LIKE " + "'" + paisA + "'";

            }
              if (numero != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

               consulta = consulta + " l.numero =" + numero  ;

            }
            if (piso != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                  consulta = consulta + " l.piso =" + piso  ;

            }

        }
       System.out.println(consulta);
        
          System.out.println(consulta);
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query query = em.createQuery(consulta);

        return (Long) query.getSingleResult();
        
        } finally {
            em.close();
        }
    }

   


}
